package com.xxx.base.spring.convert;

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

import org.springframework.core.convert.converter.Converter;

/**
 * 自定义可配置Convert. String -> Boolean.
 * @author hubert
 */
public class CustomStringToBooleanConverter implements Converter<String, Boolean> {

    private Set<String> trueValues;
    private Set<String> falseValues;



    public CustomStringToBooleanConverter() {
        trueValues = new HashSet<>(5);
        trueValues.add("true");
        trueValues.add("on");
        trueValues.add("yes");
        trueValues.add("y");
        trueValues.add("1");

        falseValues = new HashSet<>(5);
        falseValues.add("false");
        falseValues.add("off");
        falseValues.add("no");
        falseValues.add("n");
        falseValues.add("0");
    }



    public CustomStringToBooleanConverter(Set<String> pTrueValues, Set<String> pFalseValues) {
        Objects.requireNonNull(pTrueValues, "trueValue should not is null");
        Objects.requireNonNull(pFalseValues, "falseValue should not is null");
        this.trueValues = pTrueValues;
        this.falseValues = pFalseValues;
    }



    @Override
    public Boolean convert(String pSource) {
        String value = pSource.trim();
        if ("".equals(value)) {
            return null;
        }
        value = value.toLowerCase();
        if (trueValues.contains(value)) {
            return Boolean.TRUE;
        } else if (falseValues.contains(value)) {
            return Boolean.FALSE;
        } else {
            throw new IllegalArgumentException("Invalid boolean value '" + pSource + "'");
        }
    }



    /**
     * @return the trueValues
     */
    public Set<String> getTrueValues() {
        return trueValues;
    }



    /**
     * @return the falseValues
     */
    public Set<String> getFalseValues() {
        return falseValues;
    }



    /**
     * @param pTrueValues
     *            the trueValues to set
     */
    public void setTrueValues(Set<String> pTrueValues) {
        trueValues = pTrueValues;
    }



    /**
     * @param pFalseValues
     *            the falseValues to set
     */
    public void setFalseValues(Set<String> pFalseValues) {
        falseValues = pFalseValues;
    }

}
